<?php

/**
 * 这是一个通过模板生成PHP代码的类
 * 创建成功则返回文件名，失败（文件存在）则返回false
 */
class Model_AutoCoder {
	
	var $codeTempDir = '/CodeTemp/';
	
	/**
	 * 分析模板中的标签，并返回包含标签数组
	 */
	function AnalyzeCodeTemp($tempfilename){
		
		//读取模板内容
		$codetemp = $this->_readFile($tempfilename);
		if(!$codetemp)return false;
		
		// 分析模板名称
		return $this->_AnalyzeCodeTemp($codetemp);
	}
	
	function MakeFile($labels){
		
		//读取模板内容
		$codetemp = $this->_readFile($labels['tempfilename']);
		
		// 分析模板名称
		$arr = $this->_AnalyzeCodeTemp($codetemp);
		
		// 完成模板变量替换
		foreach ($arr['labels'] as $key=>$value) {
			$regex = '/' . $value[0] .'/U';
			$replace = $labels['name'][$key];
			$codetemp = preg_replace($regex, $replace, $codetemp);
		}
		
		// 类名分解为目录名和文件名，要求第一个模板标签必须是FLEA的标准类名
		$namearr = split('_',$labels['name'][0]);
		$last = count($namearr)-1;
		$filename = $namearr[$last] . '.php'; 
		unset($namearr[$last]);
		$dirname = APPDIR . '/';
			foreach ($namearr as $value) {
				$dirname .= $value . '/';
			}
		$filename = $dirname . $filename;
			
		// 目录是否存在，如果不存在则尝试一层一层地创建目录
		if (!is_dir($dirname)) {
			$thisdir = APPDIR . '/';
			foreach ($namearr as $value) {
				$thisdir .= $value . '/';
				if (!is_dir($thisdir)) {
					mkdir($thisdir);
				}
			}
		}
		
		// 文件是否存在，如果不存在则创建文件，存在则返回错误
		if (!file_exists($filename)){
			file_put_contents($filename, $codetemp);
			return $filename;
		}else{
			return false;
		}
		
	}
	
	function _AnalyzeCodeTemp($codetemp){
		
		// 分析模板名称
		$find = "/\/\*(.+)\*\//";
		$title = array();
		preg_match($find, $codetemp, $title);
		
		// 分析模板中的变量
		$find = "/{{(.+)}}/U";
		$labels = array();
		preg_match_all($find, $codetemp, $labels, PREG_SET_ORDER);
		
		// 去掉搜索结果中重复的值
		$labels = array_unique($labels);
		
		return array('title'=>$title, 'labels'=>$labels);
	}
	
	/**
	 * 读取并返回模板内容
	 */
	function _readFile($tempfilename){
		// 尝试读取模板，失败则返回false
		$codetemp = @file_get_contents( APPDIR . $this->codeTempDir . $tempfilename );
		if(empty($codetemp)) {
			return false;
		}else{
			return $codetemp;
		}
	}
	
}

?>